// 导入必要的依赖
import { Keypair } from '@solana/web3.js';
import { geyserClient as jitoGeyserClient } from 'jito-ts';
import { config } from '../config.js';

// 导入 SearcherClient 相关模块
import * as fs from 'fs';
import {
  SearcherClient,
  searcherClient as jitoSearcherClient,
} from 'jito-ts/dist/sdk/block-engine/searcher.js';

// 从配置文件中获取必要的配置参数
const BLOCK_ENGINE_URLS = config.get('block_engine_urls'); // 区块引擎URL列表
const AUTH_KEYPAIR_PATH = config.get('auth_keypair_path'); // 认证密钥对路径

const GEYSER_URL = config.get('geyser_url'); // Geyser服务URL
const GEYSER_ACCESS_TOKEN = config.get('geyser_access_token'); // Geyser访问令牌

// 读取并解码认证密钥
const decodedKey = new Uint8Array(
  JSON.parse(fs.readFileSync(AUTH_KEYPAIR_PATH).toString()) as number[],
);
const keypair = Keypair.fromSecretKey(decodedKey);

// 存储所有区块引擎客户端的数组
const searcherClients: SearcherClient[] = [];

// 为每个区块引擎URL创建一个客户端实例
for (const url of BLOCK_ENGINE_URLS) {
  const client = jitoSearcherClient(url, keypair, {
    'grpc.keepalive_timeout_ms': 4000, // gRPC保活超时设置
  });
  searcherClients.push(client);
}

// 创建Geyser客户端实例
const geyserClient = jitoGeyserClient(GEYSER_URL, GEYSER_ACCESS_TOKEN, {
  'grpc.keepalive_timeout_ms': 4000, // gRPC保活超时设置
});

// 所有发送的包都会自动转发到其他区域
// 假设数组中的第一个区块引擎是最近的一个
const searcherClient = searcherClients[0];

export { geyserClient, searcherClient, searcherClients };
